package com.flst.persistance.jdbcDao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.flst.model.Produit;
import com.flst.persistance.IProduitDao;
/**
 * 
 * Cette classe contient l'implementation JDBC de l'interface IProduitDao
 *
 */
public class ProduitDaoJdbc implements IProduitDao{
	private static final String QUERY_GET_PRODUCTS_VIEWS="SELECT * FROM PRODUIT ORDER BY VISITE DESC LIMIT 0,3";
	private static final String QUERY_GET_PRODUCTS_SOLDS="SELECT * FROM PRODUIT ORDER BY POPULARITE DESC LIMIT 0,3";
	
	private static final String QUERY_GET_INFO_PRODUIT="SELECT * FROM PRODUIT where ID=?";

	private static final String QUERY_UPDATE_VISITE_PRODUIT="update produit set visite = (select visite from produit where id =?)+1 where id =?";
	private static final String QUERY_UPDATE_POPULARITE_PRODUIT="update produit set popularite = (select popularite from produit where id =?)+1 where id =?";
	
	
	/**
	 * Cette m&eacute;thode retourne les informations d'un produit.<br/>
	 * Il y a deux requ&egrave;tes :
	 * <ul>
	 * <li>QUERY_UPDATE_VISITE_PRODUIT - pour incrementer le nombre de vues d'un produit</li>
	 * <li>QUERY_GET_INFO_PRODUIT - pour obtenir les informations du produit</li>
	 * </ul>
	 * @param idPro
	 * 		param&egrave;tre d'un produit
	 * @return le mod&egrave;le d'un produit
	 */
	@Override
	public Produit getProduit(int idPro) {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Produit produit=new Produit();

		PreparedStatement vPs=null;
		try {
			vPs = con.prepareStatement(QUERY_UPDATE_VISITE_PRODUIT) ;
			vPs.setInt(1, idPro);
			vPs.setInt(2, idPro);
			vPs.execute();
			
			vPs = con.prepareStatement(QUERY_GET_INFO_PRODUIT) ;
			vPs.setInt(1, idPro);
			vPs.execute();
			ResultSet vRs=vPs.getResultSet();
			vRs.next();
			//produit.setCategorie();
			System.out.println("id au panier :"+ idPro);
			produit.setId(idPro);
			produit.setPopularite(vRs.getInt("POPULARITE"));
			produit.setDescription(vRs.getString("DESCRIPTION"));
			produit.setKeyword(vRs.getString("MOTCLES"));
			produit.setPrix(vRs.getInt("PRIX"));
			produit.setTitre(vRs.getString("TITRE"));
			produit.setUrlPhoto(vRs.getString("URLPHOTO"));
			produit.setVisite(vRs.getInt("VISITE"));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return produit;
	}

	/**
	 * R&eacute;cup&egrave;re une liste de produits gr&acirc;ce &agrave; la requ&egrave;te QUERY_GET_PRODUITSS_VIEWS
	 * @return La liste des trois produits les plus vues
	 */
	@Override
	public List<Produit> getProduitsVues() {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		List<Produit> liste=new ArrayList<Produit>();
		
		Statement s;
		try {
			s = con.createStatement();
			s.execute(QUERY_GET_PRODUCTS_VIEWS);
			ResultSet rs = s.getResultSet();
			while(rs.next()){
				Produit produit=new Produit();
				produit.setId(rs.getInt("ID"));
				produit.setDescription(rs.getString("DESCRIPTION"));
				produit.setKeyword(rs.getString("MOTCLES"));
				produit.setPopularite(rs.getInt("POPULARITE"));
				produit.setPrix(rs.getFloat("PRIX"));
				
				String titre=null;
				if (rs.getString("TITRE").length()>32) titre=rs.getString("TITRE").substring(0, 32)+"...";
				else titre=rs.getString("TITRE");
				
				produit.setTitre(titre);
				produit.setUrlPhoto(rs.getString("URLPHOTO"));
				produit.setVisite(rs.getInt("VISITE"));
				liste.add(produit);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return liste;
	}

	/**
	 * Incremente le champs popularit&eacute; d'un produit lors de son achat
	 * @param idPro
	 * 			 ID d'un produit
	 * 
	 */
	@Override
	public void incrementProduitPopularite(int idPro) {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		PreparedStatement vPs=null;
		try {
			vPs = con.prepareStatement(QUERY_UPDATE_POPULARITE_PRODUIT) ;
			vPs.setInt(1, idPro);
			vPs.setInt(2, idPro);
			vPs.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
	/**
	 * R&eacute;cup&egrave;re une liste de produits gr&acirc;ce &agrave; la requ&egrave;te QUERY_UPDATE_POPULARITE_PRODUIT
	 * @return La liste des trois produits les plus vendues
	 */
	@Override
	public List<Produit> getProduitsVendues() {
		Connection con=null;
		try {
			con = JdbcUtils.getInstance().getConnection();
		} catch (JdbcException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		List<Produit> liste=new ArrayList<Produit>();
		
		Statement s;
		try {
			s = con.createStatement();
			s.execute(QUERY_GET_PRODUCTS_SOLDS);
			ResultSet rs = s.getResultSet();
			while(rs.next()){
				Produit produit=new Produit();
				produit.setId(rs.getInt("ID"));
				produit.setDescription(rs.getString("DESCRIPTION"));
				produit.setKeyword(rs.getString("MOTCLES"));
				produit.setPopularite(rs.getInt("POPULARITE"));
				produit.setPrix(rs.getFloat("PRIX"));
				
				String titre=null;
				if (rs.getString("TITRE").length()>32) titre=rs.getString("TITRE").substring(0, 32)+"...";
				else titre=rs.getString("TITRE");
				
				produit.setTitre(titre);
				produit.setUrlPhoto(rs.getString("URLPHOTO"));
				produit.setVisite(rs.getInt("VISITE"));
				liste.add(produit);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return liste;
	}
}

